<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;

class CreateNodesTable extends Migration
{

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('nodes', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name')->index();
            $table->string('slug')->nullable()->index();
            $table->smallInteger('parent_node')->nullable()->index();
            $table->text('description')->nullable();
            $table->integer('topic_count')->default(0)->index();
            $table->timestamps();
        });

        $this->initializeNodes();
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('nodes');
    }

    public function initializeNodes()
    {
        DB::table('nodes')->truncate();
        $node_array = [
            '数字逻辑与数字系统' => [
                '三态门' => [
                    'slug' => '三态门',
                    'description' => '三态门（英语：Three-state gate）是一种重要的总线接口电路。',
                ],
                '选择器与译码器' => [
                    'slug' => '选择器与译码器',
                    'description' => '选择器与译码器',
                ],
                '全加器' => [
                    'slug' => '全加器',
                    'description' => '全加器英语名称为full-adder，是用门电路实现两个二进制数相加并求出和的组合线路，称为一位全加器。一位全加器可以处理低位进位，并输出本位加法进位。多个一位全加器进行级联可以得到多位全加器。',
                ],
                '计数器' => [
                    'slug' => '计数器',
                    'description' => '计数是一种最简单基本的运算，计数器就是实现这种运算的逻辑电路。',
                ],
            ],
            '微机原理与接口技术' => [
                'I/O地址译码' => [
                    'slug' => 'I/O地址译码',
                    'description' => 'I/O地址译码',
                ],
                '简单并行接口' => [
                    'slug' => '简单并行接口',
                    'description' => '简单并行接口',
                ],
                '可编程定时器与计数器' => [
                    'slug' => '可编程定时器与计数器',
                    'description' => '可编程定时器与计数器',
                ],
                '可编程并行接口' => [
                    'slug' => '可编程并行接口',
                    'description' => '可编程并行接口',
                ],
                '交通灯控制' => [
                    'slug' => '交通灯控制',
                    'description' => '交通灯控制',
                ],
                '七段数码管' => [
                    'slug' => '七段数码管',
                    'description' => '七段数码管',
                ],
                '继电器' => [
                    'slug' => '继电器',
                    'description' => '继电器',
                ],
                '串行通信' => [
                    'slug' => '串行通信',
                    'description' => '串行通信',
                ],
                '步进电机' => [
                    'slug' => '步进电机',
                    'description' => '步进电机',
                ],
            ],
            '计算机组成原理' => [
                '运算器' => [
                    'slug' => '运算器',
                    'description' => '运算器：arithmetic unit，计算机中执行各种算术和逻辑运算操作的部件。运算器的基本操作包括加、减、乘、除四则运算，与、或、非、异或等逻辑操作，以及移位、比较和传送等操作，亦称算术逻辑部件（ALU）。',
                ],
                '存储器' => [
                    'slug' => '存储器',
                    'description' => '存储器（Memory）是现代信息技术中用于保存信息的记忆设备。其概念很广，有很多层次，在数字系统中，只要能保存二进制数据的都可以是存储器；在集成电路中，一个没有实物形式的具有存储功能的电路也叫存储器，如RAM、FIFO等；在系统中，具有实物形式的存储设备也叫存储器，如内存条、TF卡等。',
                ],
                '数据通路' => [
                    'slug' => '数据通路',
                    'description' => '数字系统中，各个子系统通过数据总线连接形成的数据传送路径称为数据通路。',
                ],
                '微程序控制器' => [
                    'slug' => '微程序控制器',
                    'description' => '微程序控制器是一种控制器，同组合逻辑控制器相比较，具有规整性、灵活性、可维护性等一系列优点，因而在计算机设计中逐渐取代了早期采用的组合逻辑控制器，并已被广泛地应用。在计算机系统中，微程序设计技术是利用软件方法来设计硬件的一门技术。',
                ],
                'CPU组成与机器指令执行' => [
                    'slug' => 'CPU组成与机器指令执行',
                    'description' => '中央处理器（CPU，Central Processing Unit）是一块超大规模的集成电路，是一台计算机的运算核心（Core）和控制核心（ Control Unit）。它的功能主要是解释计算机指令以及处理计算机软件中的数据。机器指令（Machine Instructions）是CPU能直接识别并执行的指令，它的表现形式是二进制编码。机器指令通常由操作码和操作数两部分组成，操作码指出该指令所要完成的操作，即指令的功能，操作数指出参与运算的对象，以及运算结果所存放的位置等。',
                ],
                '硬布线控制嚣' => [
                    'slug' => '硬布线控制嚣',
                    'description' => '硬布线控制器是早期设计计算机的一种方法。硬布线控制器是将控制部件做成产生专门固定时序控制信号的逻辑电路，产生各种控制信号，因而又称为组合逻辑控制器。这种逻辑电路以使用最少元件和取得最高操作速度为设计目标，因为该逻辑电路由门电路和触发器构成的复杂树型网络，所以称为硬布线控制器。',
                ],
            ],
        ];

        $top_nodes = array();
        foreach ($node_array as $key => $value) {
            $top_nodes[] = [
                'name' => $key
            ];
        }
        DB::table('nodes')->insert($top_nodes);

        $nodes = array();
        foreach ($node_array as $key => $value) {
            $top_node = Node::where('name', '=', $key)->first();

            foreach ($value as $snode => $svalue) {
                $nodes[] = [
                    'parent_node' => $top_node->id,
                    'name' => $snode,
                    'slug' => $svalue['slug'],
                    'description' => $svalue['description'],
                ];
            }
        }
        DB::table('nodes')->insert($nodes);
    }
}
